// 导航守卫（此处专门用来做权限拦截处理）
// 导入router对象
import router from '@/router/index'
import store from '@/store/index'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
// 创建一个白名单（白名单就是指不需要登录就可以访问的页面）
const WRITE_LIST = ['/404', '/login']

// 给router设置导航守卫
// 设置前置守卫（触发时间 进入页面之前会触发）
router.beforeEach(async (to, from, next) => {
  // 开启进度条
  NProgress.start()
  // 去的路由 来的路由 函数（决定是否向下执行的函数）
  // 判断token是否存在
  // 获得token
  const token = store.getters.token
  // 判断token是否存在
  if (token) {
    // 存在
    // 判断访问的是否是登录页面
    if (to.path === '/login') {
      // 如果是登录页，则跳转到主页
      next('/')
      // 关闭进度条 原因：当进入主页后，对主页进行刷新后，又会激活前置守卫。
      // 重新执行进度条启动函数，但是只是刷新了当前页面，没有进行任何跳转，所以后置钩子不会执行。
      // 导致进度条开启后会一直执行，出现bug。所以在此加入停止函数。防止这种情况。
      NProgress.done()
    } else {
      // 判断是否存在用户资料
      // 得到用户名
      const username = store.getters.name
      // 取反  如果没有用户信息再去获取，如果已经有了用户信息直接继续执行即可
      if (!username) {
        // 增加权限路由后
        // 获取用户信息
        const res = await store.dispatch('user/getUserInfo')
        // 得到用户权限标识
        const mymenus = res.roles.menus
        // 根据权限标识得到用户的权限路由
        const newRoutes = await store.dispatch('permission/getRoutes', mymenus)
        // 动态的向路由对象中添加方法
        // 调用这个方法后，路由中包括了静态路由 和 权限路由
        // 先解构路由，然后如果是不存在的页面直接跳404
        router.addRoutes([...newRoutes, { path: '*', redirect: '/404', hidden: true }])
        //
        return next(to.path)
        // 获取用户信息 这是异步请求 加了await 表示当前diamante执行完了，再执行下一句
        // await store.dispatch('user/getUserInfo')
        // 如果不是登录页，则按照继续按用户要求执行即可。
        // 因为比如说从子页面 薪资管理 跳转  社保管理  其实已经不在登录页上了，而且已经登录了，有了token所以按用户点击的流程执行即可
      }
      next()
    }
  } else {
    // 不存在时
    // 判断访问的页面是否在白名单上
    if (WRITE_LIST.includes(to.path)) {
      //  存在放行
      next()
    } else {
      // 不存在跳转到登录页
      // 为了实现点击登录后跳回原登录页 ,让其记住跳转登录页之前的地址
      next(`/login?_redirect=${to.path}`)
    }
  }
})

// 后置守卫 (进入路由之后会触发)
router.afterEach((to, from) => {
  //  去的路由 来的路由
  //  关闭进度条
  NProgress.done()
})
